package main

import (
	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/redis"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"internal/internal/middleware"
	"internal/internal/repository"
	"internal/internal/repository/dao"
	"internal/internal/service"
	"internal/internal/web"
)

func main() {

	// 初始化数据库操作
	db := initDB()
	// 初始化用户相关的处理层(依赖注入)
	u := initUser(db)

	server := gin.Default()

	// 初始化session中间件
	// 创建一个用于存储 Session 数据的地方（Store），并指定存储方式为客户端的 Cookie
	//store := cookie.NewStore([]byte("secret"))

	// 使用redis存储session
	store, err := redis.NewStore(16, "tcp",
		"localhost:6379", "",
		"",
		[]byte("jingyi"))
	if err != nil {
		panic(err)
	}

	// 所有路由都会应用session中间件
	server.Use(sessions.Sessions("mysession", store))
	server.Use(middleware.NewLoginMiddlewareBuilder().
		IgnorePaths("/users/login").
		IgnorePaths("/users/signup").Build())

	u.RegisterRoutes(server)

	server.Run(":8081")

}

//func initWebServer() *gin.Engine {
//	server := gin.Default()
//
//	// Cors 跨域请求
//	server.Use(cors.New(cors.Config{
//		AllowCredentials: true,
//		AllowHeaders:     []string{"Content-Type"},
//		AllowOriginFunc: func(origin string) bool {
//			if strings.HasPrefix(origin, "http://localhost") {
//				return true
//			}
//			return strings.Contains(origin, "your_company.com")
//		},
//		MaxAge: 12 * time.Hour,
//	}))
//	return server
//}

func initUser(db *gorm.DB) *web.UserHandler {

	//依赖注入
	// 每一层都依赖下一层，但不直接创建它，而是通过外部注入
	// 数据访问层 依赖db
	ud := dao.NewUserDAO(db)
	// 存储层 依赖DAO
	repo := repository.NewUserRepository(ud)
	// service层 依赖 repository层
	svc := service.NewUserService(repo)
	// handler层 依赖 service层
	u := web.NewUserHandler(svc)
	return u
}

// 连接数据建库
func initDB() *gorm.DB {

	dsn := "root:root@tcp(localhost:13316)/webook?charset=utf8mb4&parseTime=True&loc=Local"

	// 1.连接mysql，获取db类型实例，用于后面数据库读写操作
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic(err)
	}

	// 初始化数据表
	err = dao.InitTables(db)
	if err != nil {
		panic(err)
	}
	return db

}
